#第十八章 使用asyncio包处理并发

#第一个示例 使用多线程处理

import threading
import time
import sys
import itertools

class Signal:
    go = True

def spin(msg,signal):
    write,flush = sys.stdout.write,sys.stdout.flush
    
    for char in itertools.cycle("|/-\\"): #创建一个无尽的循环迭代
        status = char+" "+msg
        s = "\x08"*len(status) #\x08 是退格符号,通过退格符合把鼠标的光标在面板中移到前面
        #s = str(len(status))
        write(status) #面板输出内容
        flush() #实时刷新输出面板
        write(s)
        time.sleep(0.2) #一个符号停留0.1秒
        if not signal.go:
            break
    write(" "*len(status)+s)
    flush()

def slow_fn():
    time.sleep(3)
    return 42

def supervisor():
    signal = Signal()
    #通过多线程执行那个无限的循环
    spinner = threading.Thread(target=spin,args=('thinking!',signal)) #创建多线程,参数为函数和函数的参数
    spinner.start() #启动多线程
    result = slow_fn()
    signal.go = False
    spinner.join() #把线程加入进程 因为一个进程可能有多个进程
    return result

def main():
    result = supervisor()
    print("answer",result)

if __name__ == "__main__":
    t0 = time.time()
    main()
    print("end by {} seconds".format(time.time()-t0))